package service;

/**
 * @Author: xwg
 * @CreateDate: 2023/4/9
 */

import model.ClickEvent;

import java.sql.SQLOutput;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

/**
 * 什么是异步代码？
 * A程序员负责编程A线程 A线程中有一段代码x是A程序员编写的，另一些代码是y，z等，
 * y，z运行顺序是固定的，多次运行时间上先后效果一定，称为y，z代码是同步的。。默认单线程编程代码均为同步
 * ，但是x真正运行环境是在B线程中，从而A线程中的y，z等与x虽然都由A程序员编写定义在A线程代码中，但是
 * xyz多次运行效果不一致。这种不可确定的不一致，称为x代码与yz是异步的
 */
public class NormalPC {

    public static void main(String[] args) {

        BlockingQueue<ClickEvent> eventChannel = new ArrayBlockingQueue<>(4);
        new Thread(() -> {
            List<String> names = Arrays.asList("div", "button", "li", "span");
            int flag = 1;
            while (true) {
                System.out.println("AAAAAAAAA---begin tick----" + flag);

                double i = Math.floor(Math.random() * names.size());
                String name = names.get((int) i);
                Integer xy = (int) (Math.random() * 100);
                System.out.println("AAAAAAAAA---middle------" + flag + "  生产的事件 ： " + name+"  " + xy);
                Runnable listener = () -> {
                    System.out.println("AAAAAAAA" + " ---当前线程名：" +
                            Thread.currentThread().getName() + " ---事件信息：" + name + "  " + xy);
                };
                ClickEvent clickEvent = new ClickEvent(name, xy, listener);


                try {
                    eventChannel.put(clickEvent);
                } catch (InterruptedException ex) {
                    ex.printStackTrace();
                }

                System.out.println("AAAAAAAAA---end tick-----" + flag);
                flag++;
                if (flag> 5) {
                    break;
                }
            }
        }, "A").start();

        new Thread(() -> {
            while (true) {

                System.out.println("BBBBBBB====begin tick=====");

                try {
                    ClickEvent e = eventChannel.take();

                    e.eventListener.run();

                } catch (InterruptedException ex) {
                    ex.printStackTrace();
                }
                System.out.println("BBBBBBB=====begin tick======");
            }
        }, "B").start();
//        1   2mid
//        2   3begin
//        3   4begin
//        4   4end
    }
}
